<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        // 基本使用
        // const arrow = () => {};

        // // 有一个参数
        // const arrow = (arg) => {};
        // const arrow = arg => {}; // 括号可省略

        // // 有多个参数
        // const arrow = (arg1, arg2, arg3) => {}

        // // 函数体只有一句
        // const arrow = () => 1; // 花括号可省略
        // // 等价于
        // const arrow = () => {return 1;};

        // // 函数体有多句
        // const arrow = arg => {
        //     if(arg){
        //         return 1;
        //     } else {
        //         return 2;
        //     }
        // };

        // 返回一个空对象
        // 这实际上只有一句，但括号不能省略，否则会被解析成代码块
        // const arrow = () => ({});


        //this的问题
        //JS函数的每次调用都与调用上下文相关联，这取决于函数是如何调用的，或者在哪里调用的。函数内部this值依赖于函数在调用时的调用上下文，
        //这通常会让开发人员不得不问自己一个问题:this值是啥。

        //1:使用new关键字调用:this指向由函数的内部[[Construct]]方法创建的新实例对象。this(新创建的实例对象)通常在默认情况下返回，除了在函数定义中显式指定了不同的返回值。
        var obj = {
            name:"翠花",
            speak:function(){
                console.log(this)
            }
        }
        obj.speak();
        //2:不使用new关键字直接调用:在非严格模式下，this指向window对象(浏览器中)。然而，在严格模式下，this值为undefined;因此，试图访问或设置此属性将引发错误。
        //3:间接使用绑定对象调用：Function.prototype对象提供了三种方法，可以在调用函数时将函数绑定到任意对象，即：call()，apply()和bind()。 使用这些方法调用函数时，this指向指定的绑定对象。
        //4:作为对象方法调用：this指向调用函数（方法）的对象，无论该方法是被定义为对象的自己的属性还是从对象的原型链中解析。
        //5:作为事件处理程序调用:对于用作DOM事件侦听器的常规函数，this指向触发事件的目标对象、DOM元素、document或window 。
        
    
    </script>
</body>
</html>